package orm

import (
	"database/sql/driver"
	"encoding/json"
	"errors"
	"fmt"
	"gitee.com/dreamwood/ez"
)

// 自定义文件类型
type Any struct{}

func (f *Any) String() string {
	if f != nil {
		tmp, e := json.Marshal(f)
		ez.PrintError(e)
		return string(tmp)
	}
	return ""
}

// 从数据库取出后格式化成为自定义类型
func (f *Any) Scan(v interface{}) error {
	jsonString, ok := v.([]byte)
	if !ok {
		return errors.New("数据类型异常:Any_[]byte")
	}
	e := json.Unmarshal(jsonString, &f)
	if e != nil {
		ez.Debug(e.Error())
	}
	return nil
}

// 存入数据库前保存成数据库可以存储的类型
func (f Any) Value() (driver.Value, error) {
	return f.String(), nil
}

type File *SingleFile

// 自定义文件类型
type SingleFile struct {
	Name string `json:"name"`
	Url  string `json:"url"`
	Size string `json:"size"`
}

func (f *SingleFile) String() string {
	if f != nil {
		tmp, e := json.Marshal(f)
		ez.PrintError(e)
		return string(tmp)
	}
	return ""
}

// 从数据库取出后格式化成为自定义类型
func (f *SingleFile) Scan(v interface{}) error {
	jsonString, ok := v.([]byte)
	if !ok {
		return errors.New("数据类型异常:File_[]byte")
	}
	e := json.Unmarshal(jsonString, &f)
	if e != nil {
		ez.Debug(e.Error())
	}
	return nil
}

// 存入数据库前保存成数据库可以存储的类型
func (f SingleFile) Value() (driver.Value, error) {
	return f.String(), nil
}

// 自定义多文件
type Files []*File

func (f *Files) String() string {
	if f != nil {
		tmp, e := json.Marshal(f)
		ez.PrintError(e)
		return string(tmp)
	}
	return ""
}

func (f *Files) Scan(v interface{}) error {
	jsonString, ok := v.([]byte)
	if !ok {
		return errors.New("数据类型异常:Files_string")
	}
	e := json.Unmarshal(jsonString, &f)
	if e != nil {
		ez.Debug(e.Error())
	}
	return nil
}

func (f Files) Value() (driver.Value, error) {
	return f.String(), nil
}

func (f *Files) Get(index int) (*File, error) {
	files := make([]*File, 0)
	e := json.Unmarshal([]byte(f.String()), &files)
	if index > len(files) {
		return nil, errors.New(fmt.Sprintf("试图从%d个文件中取出第%d个", len(files), index+1))
	}
	return files[index], e
}
